home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
asmbler.arc
/
FONTEDIT.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-11-19
|
15KB
|
1,051 lines
PAGE 55,132
TITLE FONTEDIT - Copyright 1983 Mathews Associates
PUBLIC INITIAL,FATAL,READIN,SETUP
; General DOS invocation macro
DOS MACRO FNC,VAL,VBX,VCX,VDX,VSI,VDI
IFNB <VDI>
MOV DI,VDI
ENDIF
IFNB <VSI>
MOV SI,VSI
ENDIF
IFNB <VDX>
MOV DX,VDX
ENDIF
IFNB <VCX>
MOV CX,VCX
ENDIF
IFNB <VBX>
MOV BX,VBX
ENDIF
IFNB <VAL>
MOV AL,VAL
ENDIF
IFNB <FNC>
MOV AH,FNC
ENDIF
INT 33
ENDM
; Internal print string macro (string, raster line, byte offset)
PRT MACRO STR,YCO,XCO
MOV SI,OFFSET STR
MOV DX,(YCO)*256+XCO
CALL PRINT
ENDM
FE SEGMENT
ASSUME CS:FE,DS:FE
ORG 080H
INLEN DB 1 DUP (?) ; Length of input from DOS
INPUT DB 127 DUP (?) ; Input remnant from DOS
ORG 0100H
START PROC NEAR
CALL INITIAL ; Clear screen and load font
MOV INDEX,0 ; Select zero element for edit
CALL EXEC ; Execute commands issued
CALL FINAL ; Store fonts
MOV AH,0 ; Restore screen state
MOV AL,VSTATE
INT 16
DOS 76,0 ; and terminate
START ENDP
NOTICE DB 'FONTEDIT Copyright 1983 Mathews Associates',13,10,'$'
USAGE DB 13,10,'FONTEDIT should be used with a pathname'
DB ' of the font to be altered or created.',13,10
DB 'I.e. C>FONTEDIT \QUADSCREEN\FONTS\CH5X7.FON',13,10
DB 'If the extension is omitted then .FON will be assumed.',13,10
DB '$'
FILEIS DB 'Font:',0
XMSG DB 'Enter width in dots of character font (4 <= N <= 32) :$'
YMSG DB 'Enter height in dots of character font (4 <= N <= 32) :$'
FMSG DB 'Fatal error has occurred.',13,10,'$'
QMSG1 DB 'Pressing F6 initiates the cancel edit sequence. The font',0
QMSG2 DB 'definition file will be restored to the state it was in',0
QMSG3 DB 'before FONTEDIT was executed. If this is what you want to',0
QMSG4 DB 'do then press the F1 key now else press the F2 key to',0
QMSG5 DB 'continue with the edit.',0
NMSG1 DB 'FONTEDIT Version 1.02 @ 1983 Mathews Associates',0
NMSG2 DB 'F1 - Edit entry / Done F2 - Cancel entry',0
NMSG3 DB 'F3 - Edit with displayed data F4 - Edit with null data',0
NMSG4 DB 'F5 - Exit and write font F6 - Quit and cancel edit',0
NMSG5 DB 'F7 - Disable pen F8 - Unused',0
NMSG6 DB 'F9 - Enable white pen F& - Enable black pen',0
NMSG7 DB 'Arrows are used to move between characters and dots.',0
NMSG8 DB 'Diagonals may be used in character entry.',0
NMSG9 DB 'Center key (5) toggles dot state (Num Lock must be on).',0
NMSG10 DB 'Left hex value is character selected, right hex value is',0
NMSG11 DB 'last character loaded into buffer.',0
HMSG DB '00 : 00',0
BITCURR DB 000H,018H,018H,07EH,07EH,018H,018H,000H
BITON DB 0BDH,03CH,0FFH,0FFH,0FFH,0FFH,03CH,0BDH
BITOFF DB 081H,000H,000H,000H,000H,000H,000H,081H
DEFEXT DB '.FON',0
BAKEXT DB '.BAK',0
MASKS DB 000H,080H,0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH
BITS DB 080H,040H,020H,010H,008H,004H,002H,001H
PATH DB 64 DUP (?) ; Original path and file
BACKUP DB 64 DUP (?) ; Backup path and file
NEWFILE DB ? ; New file flag
HANDLE DW ? ; File handle
INDEX DB ? ; Current character in set
XFONT DB ? ; Width in bits
YFONT DB ? ; Depth in rasters
XSIZE DB ? ; Width in bytes
CSIZE DB ? ; Total size of definition in bytes
XCURR DB ? ; Current bit in buffer
YCURR DB ? ; Current raster in buffer
EDMODE DB ? ; Edit mode (1 = pen down, 2 = white/black pen)
VSTATE DB ? ; Previous screen mode
; Edit buffer:
TBUFF DB 32/8*32 DUP (?)
; Set buffer:
FBUFF DB 32/8*32*256 DUP (?)
; Load file and setup screen
INITIAL PROC NEAR
MOV AH,15
INT 16
MOV VSTATE,AL
DOS 9,,,,<OFFSET NOTICE>
TEST INLEN,0FFH
JZ INIT3
MOV SI,OFFSET INPUT
MOV CL,INLEN
XOR CH,CH
INIT1:
CMP BYTE PTR ES:[SI],' '
JNZ INIT2
INC SI
LOOP INIT1
JMP SHORT INIT3
INIT2:
CALL READIN
CALL SETUP
RET
INIT3:
DOS 9,,,,<OFFSET USAGE>
DOS 76,0
INITIAL ENDP
; Execute commands until exit
EXEC PROC NEAR
MOV EDMODE,0
CALL DWBIG
EXEC1:
MOV DL,1
CALL DWSMALL
CALL KEYBD
JNC EXEC1B
MOV DL,0
CALL DWSMALL
CALL KEYBD
JNC EXEC1A
JMP EXEC1
EXEC1A:
PUSH AX
MOV DL,1
CALL DWSMALL
POP AX
EXEC1B:
CMP AH,59
JNZ EXEC2
MOV XCURR,0
MOV YCURR,0
MOV AL,INDEX
MUL CSIZE
ADD AX,OFFSET FBUFF
MOV SI,AX
MOV DI,OFFSET TBUFF
MOV AX,DS
MOV ES,AX
MOV CL,CSIZE
XOR CH,CH
CLD
REP MOVSB
CALL EDIT
JMP EXEC1
EXEC2:
CMP AH,61
JNZ EXEC3
CALL EDIT
JMP EXEC1
EXEC3:
CMP AH,62
JNZ EXEC4
MOV DI,OFFSET TBUFF
MOV AX,DS
MOV ES,AX
MOV CL,CSIZE
XOR CH,CH
XOR AX,AX
CLD
REP STOSB
CALL EDIT
JMP EXEC1
EXEC4:
CMP AH,72
JNZ EXEC5
MOV DL,0
CALL DWSMALL
SUB INDEX,010H
MOV DH,240
MOV DL,0
MOV AL,INDEX
CALL PRHEX
JMP EXEC1
EXEC5:
CMP AH,80
JNZ EXEC6
MOV DL,0
CALL DWSMALL
ADD INDEX,010H
MOV DH,240
MOV DL,0
MOV AL,INDEX
CALL PRHEX
JMP EXEC1
EXEC6:
CMP AH,75
JNZ EXEC7
MOV DL,0
CALL DWSMALL
MOV AL,INDEX
MOV AH,AL
AND AH,0F0H
DEC AL
AND AL,00FH
OR AL,AH
MOV INDEX,AL
MOV DH,240
MOV DL,0
MOV AL,INDEX
CALL PRHEX
JMP EXEC1
EXEC7:
CMP AH,77
JNZ EXEC8
MOV DL,0
CALL DWSMALL
MOV AL,INDEX
MOV AH,AL
AND AH,0F0H
INC AL
AND AL,00FH
OR AL,AH
MOV INDEX,AL
MOV DH,240
MOV DL,0
MOV AL,INDEX
CALL PRHEX
JMP EXEC1
EXEC8:
CMP AH,63
JNZ EXEC9
RET
EXEC9:
CMP AH,64
JNZ EXEC10
CALL QUERY
JC EXEC10
MOV AH,0 ; Restore screen state
MOV AL,VSTATE
INT 16
DOS 76,0
EXEC10:
JMP EXEC1
EXEC ENDP
; Edit buffer until through
EDIT PROC NEAR
MOV EDMODE,4
MOV DH,240
MOV DL,5
MOV AL,INDEX
CALL PRHEX
EDIT1:
CALL DWBIG
EDIT2:
CALL KEYBD
JC EDIT2
CMP AH,59
JNZ EDIT3
MOV AL,INDEX
MUL CSIZE
ADD AX,OFFSET FBUFF
MOV DI,AX
MOV SI,OFFSET TBUFF
MOV CL,CSIZE
XOR CH,CH
MOV AX,DS
MOV ES,AX
CLD
REP MOVSB
MOV EDMODE,0
CALL DWBIG
RET
EDIT3:
CMP AH,60
JNZ EDIT4
MOV EDMODE,0
CALL DWBIG
RET
EDIT4:
CMP AH,65
JNZ EDIT5
AND EDMODE,NOT 1
JMP EDIT1
EDIT5:
CMP AH,67
JNZ EDIT6
OR EDMODE,3
CALL EDMOVE
JMP EDIT1
EDIT6:
CMP AH,68
JNZ EDIT7
OR EDMODE,1
AND EDMODE,NOT 2
CALL EDMOVE
JMP EDIT1
EDIT7:
CMP AH,76
JNZ EDIT8
CALL ADDBIT
XOR TBUFF[BX],AH
JMP EDIT1
EDIT8:
CMP AH,71
JNZ EDIT9
CALL EDPTUP
CALL EDPTLT
CALL EDMOVE
JMP EDIT1
EDIT9:
CMP AH,72
JNZ EDIT10
CALL EDPTUP
CALL EDMOVE
JMP EDIT1
EDIT10:
CMP AH,73
JNZ EDIT11
CALL EDPTUP
CALL EDPTRT
CALL EDMOVE
JMP EDIT1
EDIT11:
CMP AH,75
JNZ EDIT12
CALL EDPTLT
CALL EDMOVE
JMP EDIT1
EDIT12:
CMP AH,77
JNZ EDIT13
CALL EDPTRT
CALL EDMOVE
JMP EDIT1
EDIT13:
CMP AH,79
JNZ EDIT14
CALL EDPTLT
CALL EDPTDN
CALL EDMOVE
JMP EDIT1
EDIT14:
CMP AH,80
JNZ EDIT15
CALL EDPTDN
CALL EDMOVE
JMP EDIT1
EDIT15:
CMP AH,81
JNZ EDIT16
CALL EDPTDN
CALL EDPTRT
CALL EDMOVE
EDIT16:
JMP EDIT1
EDIT ENDP
; Move edit point up
EDPTUP PROC NEAR
MOV AL,YCURR
OR AL,AL
JNZ EDUP1
MOV AL,YFONT
EDUP1:
DEC AL
MOV YCURR,AL
RET
EDPTUP ENDP
; Move edit point down
EDPTDN PROC NEAR
MOV AL,YCURR
INC AL
CMP AL,YFONT
JB EDDN1
XOR AL,AL
EDDN1:
MOV YCURR,AL
RET
EDPTDN ENDP
; Move edit point left
EDPTLT PROC NEAR
MOV AL,XCURR
OR AL,AL
JNZ EDLT1
MOV AL,XFONT
EDLT1:
DEC AL
MOV XCURR,AL
RET
EDPTLT ENDP
; Move edit point right
EDPTRT PROC NEAR
MOV AL,XCURR
INC AL
CMP AL,XFONT
JB EDRT1
XOR AL,AL
EDRT1:
MOV XCURR,AL
RET
EDPTRT ENDP
; Paint new position if pen down
EDMOVE PROC NEAR
TEST EDMODE,1
JNZ EDMV1
RET
EDMV1:
CALL ADDBIT
TEST EDMODE,2
JZ EDMV2
OR TBUFF[BX],AH
RET
EDMV2:
NOT AH
AND TBUFF[BX],AH
RET
EDMOVE ENDP
; Get address and mask of current position
ADDBIT PROC NEAR
MOV AL,YCURR
MUL XSIZE
MOV BL,XCURR
MOV CL,3
SHR BL,CL
XOR BH,BH
ADD AX,BX
MOV BL,XCURR
AND BL,7
MOV BH,BITS[BX]
XCHG AX,BX
RET
ADDBIT ENDP
; Rename old file to backup and write new file
FINAL PROC NEAR
TEST NEWFILE,0FFH
JNZ FINL6
MOV AX,DS
MOV ES,AX
MOV SI,OFFSET PATH
MOV DI,OFFSET BACKUP
CLD
FINL1:
LODSB
OR AL,AL
JZ FINL2
STOSB
JMP FINL1
FINL2:
MOV [DI],AL
LEA SI,[DI-1]
STD
FINL3:
LODSB
CMP AL,'.'
JNZ FINL3
LEA DI,[SI+1]
MOV SI,OFFSET BAKEXT
MOV CX,5
CLD
REP MOVSB
DOS 65,,,,<OFFSET BACKUP>
JNC FINL4
CMP AL,2
JNZ FINL5
FINL4:
DOS 86,,,,<OFFSET PATH>,,<OFFSET BACKUP>
JNC FINL6
FINL5:
CALL FATAL
FINL6:
DOS 60,,,0,<OFFSET PATH>
JC FINL5
MOV HANDLE,AX
DOS 64,,HANDLE,1,<OFFSET XFONT>
JC FINL5
CMP AX,CX
JNZ FINL5
DOS 64,,HANDLE,1,<OFFSET YFONT>
JC FINL5
CMP AX,CX
JNZ FINL5
MOV CH,CSIZE
XOR CL,CL
DOS 64,,HANDLE,,<OFFSET FBUFF>
JC FINL5
CMP AX,CX
JNZ FINL5
DOS 62,,HANDLE
JC FINL5
RET
FINAL ENDP
; Load font file
READIN PROC NEAR
MOV AX,DS
MOV ES,AX
MOV DI,OFFSET PATH
PUSH CX
CLD
REP MOVSB
POP CX
MOV BYTE PTR [DI],0
MOV SI,DI
STD
DEC SI
RDIN1:
LODSB
CMP AL,'.'
JZ RDIN3
CMP AL,'\'
JZ RDIN2
CMP AL,'/'
JZ RDIN2
LOOP RDIN1
RDIN2:
MOV SI,OFFSET DEFEXT
MOV CX,5
CLD
REP MOVSB
DEC DI
RDIN3:
MOV NEWFILE,0
DOS 61,0,,,<OFFSET PATH>
JNC RDIN4
CMP AL,2
JNZ RDIN5
INC NEWFILE
JMP RDIN7
RDIN4:
MOV HANDLE,AX
DOS 63,,AX,1,<OFFSET XFONT>
JC RDIN5
CMP AX,1
JZ RDIN6
RDIN5:
CALL FATAL
RDIN6:
DOS 63,,HANDLE,1,<OFFSET YFONT>
JC RDIN5
CMP AX,1
JNZ RDIN5
CALL CALCSZ
DOS 63,,HANDLE,,<OFFSET FBUFF>
JC RDIN5
CMP AX,CX
JNZ RDIN5
DOS 62,,HANDLE
JC RDIN5
RET
RDIN7:
MOV SI,OFFSET XMSG
CALL INVAL
MOV XFONT,AL
MOV SI,OFFSET YMSG
CALL INVAL
MOV YFONT,AL
CALL CALCSZ
MOV AX,DS
MOV ES,AX
XOR AL,AL
MOV DI,OFFSET FBUFF
CLD
REP STOSB
RET
READIN ENDP
; Calculate total font size
CALCSZ PROC NEAR
MOV AL,XFONT
ADD AL,7
MOV CL,3
SHR AL,CL
MOV XSIZE,AL
MUL YFONT
MOV CSIZE,AL
MOV CH,AL
XOR CL,CL
RET
CALCSZ ENDP
; Setup screen and display current character set
SETUP PROC NEAR
CALL CLEAR
MOV INDEX,0
SETP1:
XOR DL,DL
CALL DWSMALL
INC INDEX
JNZ SETP1
MOV CX,32/8*32/2
MOV DI,OFFSET TBUFF
MOV AX,DS
MOV ES,AX
CLD
XOR AX,AX
REP STOSW
PRT NMSG1,0,0
PRT FILEIS,20,0
PRT PATH,20,6
PRT NMSG2,40,0
PRT NMSG3,50,0
PRT NMSG4,60,0
PRT NMSG5,70,0
PRT NMSG6,80,0
PRT NMSG7,95,0
PRT NMSG8,105,0
PRT NMSG9,115,0
PRT NMSG10,130,0
PRT NMSG11,140,0
PRT HMSG,240,0
RET
SETUP ENDP
; Erase screen
CLEAR PROC NEAR
MOV DX,0220H
MOV AX,04000H
OUT DX,AX
MOV CX,08000H
MOV AX,0D000H
MOV ES,AX
XOR AX,AX
REP STOSW
RET
CLEAR ENDP
; Display current character at appropriate position
DWSMALL PROC NEAR
MOV AX,0D000H
MOV ES,AX
MOV AL,INDEX
MOV BH,AL
AND BH,0F0H
MOV BL,AL
AND BL,00FH
MOV CL,2
SHL BL,CL
MUL CSIZE
ADD AX,OFFSET FBUFF
MOV SI,AX
MOV DH,YFONT
OR DL,DL
JNZ DWSM2
DWSM1:
XOR CH,CH
MOV CL,XSIZE
MOV DI,BX
CLD
REP MOVSB
ADD BX,128
DEC DH
JNZ DWSM1
RET
DWSM2:
MOV CX,BX
DWSM3:
MOV BL,XFONT
MOV DI,CX
CLD
DWSM4:
CMP BL,8
JB DWSM5
LODSB
NOT AL
STOSB
SUB BL,8
JMP DWSM4
DWSM5:
OR BL,BL
JZ DWSM6
LODSB
XOR BH,BH
XOR AL,MASKS[BX]
STOSB
DWSM6:
ADD CX,128
DEC DH
JNZ DWSM3
RET
DWSMALL ENDP
; Display edit buffer and corresponding character
DWBIG PROC NEAR
MOV AX,0D000H
MOV ES,AX
MOV SI,OFFSET TBUFF
MOV DH,YFONT
MOV BX,256*128+70
CLD
DWBG1:
MOV DL,XFONT
MOV DI,BX
DWBG2:
MOV AL,XFONT
XOR AL,DL
AND AL,7
JNZ DWBG3
MOV AH,[SI]
INC SI
DWBG3:
MOV CX,8
PUSH SI
PUSH DI
MOV SI,OFFSET BITON
SHL AH,1
JC DWBG4
MOV SI,OFFSET BITOFF
DWBG4:
LODSB
MOV ES:[DI],AL
ADD DI,128
LOOP DWBG4
POP DI
POP SI
INC DI
DEC DL
JNZ DWBG2
ADD BX,128*8
DEC DH
JNZ DWBG1
MOV SI,OFFSET TBUFF
MOV BX,256*128+65
MOV DH,YFONT
DWBG5:
XOR CH,CH
MOV CL,XSIZE
MOV DI,BX
CLD
REP MOVSB
ADD BX,128
DEC DH
JNZ DWBG5
TEST EDMODE,4
JNZ DWBG6
RET
DWBG6:
MOV AH,YCURR
XOR AL,AL
SHL AX,1
SHL AX,1
OR AL,XCURR
ADD AX,256*128+70
MOV DI,AX
MOV SI,OFFSET BITCURR
MOV CX,8
CLD
DWBG7:
LODSB
XOR ES:[DI],AL
ADD DI,128
LOOP DWBG7
RET
DWBIG ENDP
; Input value of font size
INVAL PROC NEAR
DOS 9,,,,SI
IVAL1:
DOS 7
MOV DL,AL
SUB AL,'0'
JBE IVAL1
CMP AL,9
JA IVAL1
MOV BL,AL
DOS 2
IVAL2:
DOS 7
MOV DL,AL
CMP AL,8
JNZ IVAL3
DOS 2
JMP IVAL1
IVAL3:
CMP AL,13
JNZ IVAL4
CMP BL,4
JB IVAL2
JMP IVAL7
IVAL4:
SUB AL,'0'
JC IVAL2
CMP AL,'9'
JA IVAL2
MOV AH,BL
ADD AH,AH
ADD AH,AH
ADD AH,BL
ADD AH,AH
ADD AL,AH
CMP AL,32
JA IVAL2
MOV BH,BL
MOV BL,AL
DOS 2
IVAL5:
DOS 7
MOV DL,AL
CMP AL,8
JNZ IVAL6
MOV BL,BH
DOS 2
JMP IVAL2
IVAL6:
CMP AL,13
JNZ IVAL5
CMP BL,4
JB IVAL5
IVAL7:
MOV DL,13
DOS 2
MOV DL,10
DOS 2
MOV AL,BL
RET
INVAL ENDP
; Insure user knows what quit does
QUERY PROC NEAR
PRT QMSG1,160,0
PRT QMSG2,170,0
PRT QMSG3,180,0
PRT QMSG4,190,0
PRT QMSG5,200,0
QURY1:
CALL KEYBD
JC QURY1
CMP AH,59
JNZ QURY2
CLC
RET
QURY2:
CMP AH,60
JNZ QURY1
MOV AX,0D004H
MOV BX,160*128
MOV DL,5*10
QURY3:
MOV DI,BX
XOR AL,AL
MOV CX,60
CLD
REP STOSB
ADD BX,128
DEC DL
JNZ QURY3
STC
RET
QUERY ENDP
; Check for input from the keyboard
KEYBD PROC NEAR
MOV AH,1
INT 22
STC
JZ KYBD1
XOR AH,AH
INT 22
KYBD1:
RET
KEYBD ENDP
; Display a value in hex in internal font
PRHEX PROC NEAR
MOV BL,AL
MOV CL,4
SHR BL,CL
XOR BH,BH
PUSH AX
MOV AL,HEXTAB[BX]
PUSH DX
CALL PCHAR
POP DX
INC DL
POP AX
MOV BL,AL
AND BX,15
MOV AL,HEXTAB[BX]
CALL PCHAR
RET
HEXTAB DB '0123456789ABCDEF'
PRHEX ENDP
; Display a string on the screen in internal font
PRINT PROC NEAR
CLD
LODSB
OR AL,AL
JZ PRNT1
PUSH DX
PUSH SI
CALL PCHAR
POP SI
POP DX
INC DL
JMP PRINT
PRNT1:
RET
PRINT ENDP
; Display a character on the screen in internal font
PCHAR PROC NEAR
XOR AH,AH
MOV SI,AX
MOV CL,3
SHL SI,CL
ADD SI,OFFSET MYFONT+2
MOV AX,0D004H
MOV ES,AX
MOV BH,DH
XOR BL,BL
SHR BX,1
XOR DH,DH
ADD BX,DX
MOV CX,8
CLD
PCHR1:
LODSB
MOV ES:[BX],AL
ADD BX,128
LOOP PCHR1
RET
PCHAR ENDP
; Display fatal error message and terminate
FATAL PROC NEAR
MOV AH,0 ; Restore screen state
MOV AL,VSTATE
INT 16
DOS 9,,,,<OFFSET FMSG>
DOS 76,0
FATAL ENDP
; Internal 8 x 8 font must be appended here
; use command COPY FONTEDIT.BIN/B+< 8X8 font name >/B FONTEDIT.COM/B
MYFONT LABEL BYTE
FE ENDS
END START